#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>

std::string serialize()
{
    // 1.将序列化的数据，存储在Json::Value中
    Json::Value root;
    root["name"] = "kang";
    root["age"] = 22;
    root["num"].append(120);
    root["num"].append(104);
    root["num"].append(111);
    // 2.实例化一个StreamWriterBuilder工厂类中
    Json::StreamWriterBuilder swb;
    // 3.通过StreamWriterBuilder工厂类对象生产一个StreamWriter对象
    Json::StreamWriter *sw = swb.newStreamWriter();
    // 4.使用StreamWriter对象，对存储在Json::Value中的数据进行序列化
    std::stringstream ss;
    int ret = sw->write(root, &ss);
    if (ret != 0)
    {
        std::cout << "Json 序列化 faild" << std::endl;
        return nullptr;
    }
    std::cout << ss.str() << std::endl;
    delete sw;
    return ss.str();
}

void unserialize(const std::string &str)
{
    //1.实例化一个CharReaderBuilder工厂类对象
    Json::CharReaderBuilder crb;
    //2.使用这个工厂类对象生产一个CharReader对象
    Json::CharReader *cr=crb.newCharReader();
    //3.定义一个Json::Value对象存储解析后的数据
    Json::Value root;
    std::string error;
    //4.使用CharReader对象进行Json格式字符串str的反序列化
    //parse(char* start, char* end, Json::Value *val, string *err)
    bool ret=cr->parse(str.c_str(),str.c_str()+str.size(),&root,&error);
    if(ret==false)
    {
        std::cout<<"json unserialize failed"<<std::endl;
        return ;
    }
    //5.逐个元素去访问Json::Value的数据
    std::cout<<"name: "<<root["name"].asString()<<std::endl;
    std::cout<<"age: "<<root["age"].asInt()<<std::endl;
    int len=root["num"].size();
    for(int i=0;i<len;i++)
    {
        std::cout<<"num: "<<root["num"][i].asFloat()<<std::endl;
    }
    delete cr;
}
int main()
{
    std::string str=serialize();
    unserialize(str);
    return 0;
}